﻿using CTS.Com.Domain.Constants;
using CTS.Com.Domain.Exceptions;
using CTS.Com.Domain.Helper;
using CTS.Data.APStorageFiles.Domain.Utils;
using CTS.Data.Domain.Constants;
using CTS.Data.MACodes.Domain.Utils;
using CTS.W._150101.Models.Domain.Common.Utils;
using CTS.W._150101.Models.Domain.Dao.Admin;
using CTS.W._150101.Models.Domain.Model.Admin.Master.Items.Entry;
using CTS.W._150101.Models.Domain.Object.Admin.Items;

namespace CTS.W._150101.Models.Domain.Logic.Admin.Master.Items.Entry
{
    public class InitLogic
    {
        #region Execute Method
        /// <summary>
        /// Xử lý init.
        /// </summary>
        /// <param name="inputObject">DataModel</param>
        /// <returns>DataModel</returns>
        public InitDataModel Execute(InitDataModel inputObject)
        {
            // Kiểm tra thông tin
            Check(inputObject);
            // Lấy thông tin
            var resultObject = GetInfo(inputObject);
            // Kết quả trả về
            return resultObject;
        }
        #endregion

        #region Private Method
        /// <summary>
        /// Kiểm tra thông tin.
        /// </summary>
        /// <param name="inputObject">DataModel</param>
        private void Check(InitDataModel inputObject)
        {
            // Khởi tạo biến cục bộ
            var processDao = new MasterItemsEntryDao();
            // Trường hợp status là edit
            if (inputObject.IsEdit) {
                if (DataCheckHelper.IsNull(inputObject.ItemCd)) {
                    throw new ExecuteException("E_MSG_00013", "Mã sản phẩm");
                }
                // Kiểm tra dữ liệu tồn tại
                var isExist = processDao.IsExist(Logics.LOCALE_DEFAULT, inputObject.ItemCd);
                if (!isExist) {
                    throw new DataNotExistException("Sản phẩm");
                }
            }
        }

        /// <summary>
        /// Lấy thông tin.
        /// </summary>
        /// <param name="inputObject">DataModel</param>
        /// <returns>DataModel</returns>
        private InitDataModel GetInfo(InitDataModel inputObject)
        {
            // Khởi tạo biến cục bộ
            var getResult = new InitDataModel();
            var processDao = new MasterItemsEntryDao();
            var masterDataCom = new MasterDataCom();
            var storageFileCom = new StorageFileCom();
            var codeCom = new CodeCom();
            var data = new ItemObject();
            // Map dữ liệu
            DataHelper.CopyObject(inputObject, getResult);
            // Trường hợp status là edit hoặc copy
            if (inputObject.IsEdit || inputObject.IsCopy) {
                data = processDao.GetInfo(Logics.LOCALE_DEFAULT, inputObject.ItemCd);
                if (inputObject.IsCopy && data == null) {
                    data = new ItemObject();
                }
            }
            // Khởi tạo giá trị init
            if (inputObject.IsAdd) {
                data.ItemCd = string.Empty;
                data.ItemName = string.Empty;
                data.DeleteFlag = false;
                data.FileCd = storageFileCom.GenFileCd();
            }
            // Khởi tạo và sao chép thông tin file
            if (inputObject.IsEdit) {
                data.FileCd = storageFileCom.GenFileCd(data.FileCd);
            }
            // Lấy danh sách loại sản phẩm
            var listType = masterDataCom.GetListCboItemType(Logics.LOCALE_DEFAULT, null, false, false);
            // Lấy danh sách mẫu sản phẩm
            var listExemplarCd = masterDataCom.GetListExemplarCd(false);
            // Lấy danh sách cờ xóa
            var listDeleteFlag = codeCom.GetDiv(Logics.LOCALE_DEFAULT, DataLogics.GRPCD_DELETE_FLAG, null, false, false);
            // Lấy giá trị combo
            var cboType = DataHelper.ToComboItems(listType, data.TypeCd);
            var cboDeleteFlag = DataHelper.ToComboItems(listDeleteFlag, data.DeleteFlag);
            // Gán giá trị trả về
            getResult.DataLocaleBase = data;
            getResult.ListType = cboType.ListItems;
            getResult.DataLocaleBase.TypeCd = cboType.SeletedValue;
            getResult.ListExemplarCd = listExemplarCd;
            getResult.ListDeleteFlag = cboDeleteFlag.ListItems;
            getResult.DataLocaleBase.DeleteFlag = DataHelper.ConvertInputBoolean(cboDeleteFlag.SeletedValue);
            // Kết quả trả về
            return getResult;
        }
        #endregion
    }
}